package com.example.demo.mapper;

import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description:
 */
@Mapper
public interface UserMapper {

    // 通过用户 id 查询用户信息
    // @Param 注解表示的是当前接口的参数在xml文件里需要用引号里的名称才能获取到
    // 加上注解才是标准格式，因为某些环境下如果不加就报错
    // 换写法，动态 sql 使用 where 标签，实现动态查询
    public UserInfo getUserById(@Param("id") Integer id);

    // 根据id修改名称，返回受影响的行数
    // 换写法，动态 sql 使用 set 标签，实现动态修改
    public int updateName(@Param("id") Integer id,
                          @Param("name") String username);

    // 根据 id 删除用户信息，返回受影响的行数
    public int deleteUser(@Param("id") Integer id);

    // 添加用户，返回受影响的行数，行数通过返回值返回
    public int insertUser(UserInfo userInfo);

    // 添加用户，返回添加用户的 自增id
    // 此时会把返回的 id 赋值到该对象的 id，不需要返回值
    public void insertUser2(UserInfo userInfo);

    // 获取列表，根据创建时间进行排序获得列表
    public List<UserInfo> getOrderList(@Param("order") String order);

    // 登录功能
    // sql注入问题练习
    public UserInfo login(@Param("username") String username,
                          @Param("password") String password);

    // 模糊查询，特殊查询
    public List<UserInfo> getListByName(@Param("username") String username);

    // 根据用户 id 获取用户信息和文章列表
    public UserInfo getUserInfoAndArticleById(@Param("id") Integer id);

    // 动态 sql 使用 if 标签，添加新用户，photo默认就是什么都没有，当我们传photo=null时
    // sql就不执行添加 photo 操作
    // 返回受影响的行数
    public int insertUser3(UserInfo userInfo);

    // 动态 sql 使用 trim 标签，同样新增一行数据返回受影响的行数
    public int insertUser4(UserInfo userInfo);

    // 动态 sql 使用 foreach 标签，根据多个id批量删除数据
    // 返回被影响的行数
    public int deleteByIds(List<Integer> list);

}
